package com.dalin.framework.common.utils;

import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Random;

//import net.sourceforge.pinyin4j.PinyinHelper;
//import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import com.dalin.framework.common.PropertyConst;

/*****************************************************************************
 * @content: 常用关于String常用操作的汇总                                                                                                                     *
 * @author : 那建林                                                                                                                                                                  *
 * @crtDate: 2010-01-19                                                     *
 ****************************************************************************/
/******************************************************************************
 * @discribe:                                                               *
 * @project : skyform-api                                                    *
 * @author  : najianlin                                                      *
 * @crtDate : 2013-8-19 上午10:26:01                                           *
 * @email   : najl@chinaskycloud.com                                         *
 * @version : 2.1.0                                                          *
 *****************************************************************************/
/******************************************************************************
 * @discribe:                                                               *
 * @project : skyform-api                                                    *
 * @author  : najianlin                                                      *
 * @crtDate : 2013-8-19 上午10:26:04                                           *
 * @email   : najl@chinaskycloud.com                                         *
 * @version : 2.1.0                                                          *
 *****************************************************************************/
public final class StringUtils {
	private StringUtils() {} // 不允许构造
	
	/*************************************************************************
	 * @content: 判断是否为null或空值
	 * @param  : 待判断字符串str(参数为String型数据)
	 * @return : 如果str为null或" "等则返回true
	 * @author : 那建林
	 * @crtDate: 2010-01-19
	 * @modDate: 2010-01-19
	 */
	public static boolean isBlank(String str) {
		return str == null 
				|| str.trim().length() == 0 
				|| PropertyConst.NULL_STR.equals(str)
				||  PropertyConst.UNDEFINED_STR.equals(str);
	}
	public static boolean isBlank(List l) {
		return l == null || l.size() == 0;
	}
	public static boolean isBlank(String[] strArray) {
		return strArray == null || strArray.length == 0;
	}
	
	
	/*************************************************************************
	 * @content: 去掉字串多余空格,例:"   aa    bb "-->"aa bb"
	 * @param  : str 待处理字符串
	 * @return : String 
	 * @author : 那建林
	 * @crtDate: 2010-05-17
	 * @modDate: 2010-05-17
	 */
	public static String removeRedundantSpace(String str) {
		if (str == null) return "";
		return str.trim().replaceAll("\\s+", " ");
	}
	
	
	/*************************************************************************
	 * @content: 去掉字串所有空格,例:"   aa    bb "-->"aabb"
	 * @param  : str 待处理字符串
	 * @return : String 
	 * @author : 那建林
	 * @crtDate: 2010-05-17
	 * @modDate: 2010-05-17
	 */
	public static String removeAllSpace(String str) {
		if (str == null) return "";
		return str.trim().replaceAll("\\s+", "");
	}
	
	
	/*************************************************************************
	 * @content: 把xml格式字符串转换为JSON格式字符串
	 * @param  : xmlStr xml字符串
	 * @return : String JSON格式字符串
	 * @author : 那建林
	 * @crtDate: 2010-03-08
	 * @modDate: 2010-03-08
	 */
	public static String formatXmlToJson(String xmlStr) {
		
		
		return null;
	}
	
	
	/*************************************************************************
	 * @content: 把JSON格式字符串转换为XML格式字符串
	 * @param  : jsonStr JSON格式字符串
	 * @return : String XML格式字符串
	 * @author : 那建林
	 * @crtDate: 2010-03-08
	 * @modDate: 2010-03-08
	 */
	public static String formatJsonToXml(String jsonStr) {
		
		
		return null;
	}
	
	
	/*************************************************************************
	 * @content: 检查字符串是否含有中文字符
	 * @param  : str 待检查的字符串
	 * @return : boolean 包含返回true
	 * @author : 那建林
	 * @crtDate: 2010-03-09
	 * @modDate: 2010-03-09
	 */
	public static boolean isContainedChinese(String str) {
		if (isBlank(str)) return false;
		return str.matches(".*[\u4e00-\u9fa5]+.*");
	}
	
	
	/*************************************************************************
	 * @content: 根据源字符串，随机抽取length个字符，连接成出字符串返回
	 * @param  : srcStr 源字符串
	 * @param  : length 随机字符的长度
	 * @return : String length个字符组成的字符串
	 * @author : 那建林
	 * @crtDate: 2010-03-09
	 * @modDate: 2010-03-09
	 */
	public static String getRandomStr(String srcStr, int length) {
		if (isBlank(srcStr)) return null;
		StringBuilder sb = new StringBuilder();
		Random rand = new Random();
		int srcStrLenth = srcStr.length();
		for (int i = 0; i < length; i++) {
			sb.append(srcStr.charAt(rand.nextInt(srcStrLenth)));
		}
		return sb.toString();
	}
	public static String getRandomStr(String[] srcStrArray, int length) {
		if (isBlank(srcStrArray)) return null;
		StringBuilder sb = new StringBuilder();
		Random rand = new Random();
		for (int i = 0; i < length; i++) {
			sb.append(srcStrArray[rand.nextInt(srcStrArray.length)]);
		}
		return sb.toString();
	}
	
	
	/*************************************************************************
	 * @content: 根据源字符串或数组，随机抽取length个返回
	 * @param  : srcStr 源字符串
	 * @param  : length 随机字符的长度
	 * @return : String[]
	 * @author : 那建林
	 * @crtDate: 2010-03-09
	 * @modDate: 2010-03-09
	 */	
	public static String[] getRandomStrArray(String srcStr, int length) {
		if (isBlank(srcStr)) return null;
		String[] rtnArray = new String[length];
		Random rand = new Random();
		int srcStrLenth = srcStr.length();
		for (int i = 0; i < length; i++) {
			rtnArray[i] = String
				.valueOf(srcStr.charAt(rand.nextInt(srcStrLenth)));
		}
		return rtnArray;
	}
	public static String[] getRandomStrArray(String[] srcStrArray, int length) {
		if (isBlank(srcStrArray)) return null;
		String[] rtnArray = new String[length];
		Random rand = new Random();
		for (int i = 0; i < length; i++) {
			rtnArray[i] = srcStrArray[rand.nextInt(srcStrArray.length)];
		}
		return rtnArray;
	}
	
	
	/*************************************************************************
	 * @content: 返回srcStr的unicode码,不足4位的16进制码以0补足
	 * @param  : srcStr 源字符串
	 * @return : String 
	 * @remark : 
	 * @author : 那建林
	 * @crtDate: 2010-03-15
	 * @modDate: 2010-03-15
	 */	
	public static String getUnicodeStr(String s) {
		StringBuffer buf = new StringBuffer();
		char[] cArray = s.toCharArray();
		String temp;
		for (char c : cArray) {
			if (!isChinese(c)) {
				buf.append(c);
				continue;
			}
			buf.append("\\u");
			temp = Integer.toHexString(c);
			int i = 4;
			while (i - temp.length() > 0) {
				buf.append("0");
				i--;
			}
			buf.append(temp);
		}
		return buf.toString();
	}

	public static boolean isChinese(char a) {
		int v = (int) a;
		return (v >= 19968 && v <= 171941);
	}

	public static String decodeUnicode(String theString) {

		char aChar;

		int len = theString.length();

		StringBuffer outBuffer = new StringBuffer(len);

		for (int x = 0; x < len;) {

			aChar = theString.charAt(x++);

			if (aChar == '\\') {

				aChar = theString.charAt(x++);

				if (aChar == 'u') {

					// Read the xxxx

					int value = 0;

					for (int i = 0; i < 4; i++) {

						aChar = theString.charAt(x++);

						switch (aChar) {

						case '0':

						case '1':

						case '2':

						case '3':

						case '4':

						case '5':

						case '6':
						case '7':
						case '8':
						case '9':
							value = (value << 4) + aChar - '0';
							break;
						case 'a':
						case 'b':
						case 'c':
						case 'd':
						case 'e':
						case 'f':
							value = (value << 4) + 10 + aChar - 'a';
							break;
						case 'A':
						case 'B':
						case 'C':
						case 'D':
						case 'E':
						case 'F':
							value = (value << 4) + 10 + aChar - 'A';
							break;
						default:
							throw new IllegalArgumentException("Malformed   \\uxxxx   encoding.");
						}

					}
					outBuffer.append((char) value);
				} else {
					if (aChar == 't')
						aChar = '\t';
					else if (aChar == 'r')
						aChar = '\r';

					else if (aChar == 'n')

						aChar = '\n';

					else if (aChar == 'f')

						aChar = '\f';

					outBuffer.append(aChar);

				}

			} else

				outBuffer.append(aChar);

		}

		return outBuffer.toString();

	}
	
	
	/*************************************************************************
	 * @content: 将byte数组转换为１６进制字符串返回，不足两位补０
	 * @param  : bytes 待转换的数组byte[]
	 * @return : String 
	 * @remark : 
	 * @author : 那建林
	 * @crtDate: 2010-11-10
	 * @modDate: 2010-11-10
	 */	
	public static String bytesToHexString(byte[] bytes) {
		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < bytes.length; i++) {
			String hex = Integer.toHexString(0xff & bytes[i]);
			if (hex.length() < 2) {
				hex = 0 + hex;
			}
			buf.append(hex);
		}
		return buf.toString();
	}
	
	/*************************************************************************
	 * @content: 把以","号隔开的String字符串转换为String数组
	 * @param  : str 待转换的String
	 * @return : String[] 
	 * @remark : 
	 * @author : 那建林
	 * @crtDate: 2010-05-11
	 * @modDate: 2010-05-11
	 */	
	public static String[] getStrArrayFromComma(String str){
		if (isBlank(str)) return null;
		return str.trim().replaceAll("，", ",").split(PropertyConst.COMMA);
	}
	
	
	/*************************************************************************
	 * @content: 将给定字符串首字母大写
	 * @param  : letter 待转换字串
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-16
	 * @modDate: 2010-03-16
	 */
	public static String capitFirstLetter(String letter) {
		char[] charArray = letter.toCharArray();
		if (charArray[0] > 96 && charArray[0] < 123) {   
			charArray[0] = (char) (charArray[0] - 32);   
        }  
		return new String(charArray);
	}
	
	
	/*************************************************************************
	 * @content: 给定字符串中的中文转换成汉语拼音,多音字取第一个， 李-->Li,格式是首字母大写
	 * @param  : str 待转换字串
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-16
	 * @modDate: 2010-03-16
	 */
//	public static String chineseToPinyin(String str)
//				throws BadHanyuPinyinOutputFormatCombination {
//		StringBuilder sb = new StringBuilder();
//		char[] charArray = str.toCharArray();
//		String[] tempArray;
//		for (char c : charArray) {
//			tempArray = PinyinHelper.toHanyuPinyinStringArray(c);
//			if (isBlank(tempArray)) {
//				sb.append(c);
//			} else {
//				str = tempArray[0];
//				sb.append(capitFirstLetter(str.substring(0, str.length()-1)));
//			}
//		}
//		return sb.toString();
//	}
	

	/*************************************************************************
	 * @content: 下划线命名法转大驼峰 命名
	 * @param  : str 待转换字串
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-16
	 * @modDate: 2010-03-16
	 */
	public static String underlineToUpperCamelCase(String str) {
		if (isBlank(str)) {
			throw new NullPointerException("Parameter 'str' is null");
		}
		StringBuilder sb = new StringBuilder();
		str = str.toLowerCase();
		String[] strArray = str.split(PropertyConst.UNDERLINE);
		for (String s : strArray) {
			sb.append(capitFirstLetter(s));
		}
		return sb.toString();
	}
	
	/*************************************************************************
	 * @content: 下划线命名法转大驼峰 命名
	 * @param  : str 待转换字串
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-16
	 * @modDate: 2010-03-16
	 */
	public static String toUpperCamelCase(String str) {
		String s1 = str.substring(0, 1);
		return s1.toUpperCase()+ str.substring(1);
	}
	

	/*************************************************************************
	 * @content: 下划线命名法转小驼峰 
	 * @param  : str 待转换字串
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-16
	 * @modDate: 2010-03-16
	 */
	public static String underlineToLowerCamelCase(String str) {
		if (isBlank(str)) {
			throw new NullPointerException("Parameter 'str' is null");
		}
		str = underlineToUpperCamelCase(str);
		return str.substring(0, 1).toLowerCase() + str.substring(1);
	}


	/*************************************************************************
	 * @content: 驼峰 命名法转下划线，字母全变为大写
	 * @param  : str 待转换字串
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-16
	 * @modDate: 2010-03-16
	 */
	public static String camelCaseToUnderline(String str) {
		if (isBlank(str)) {
			throw new NullPointerException("Parameter 'str' is null");
		}
		StringBuilder sb = new StringBuilder();
		char[] charArray = str.toCharArray();
		char c = charArray[0];
		sb.append(c);
		for (int i = 1; i < charArray.length; i++) {
			c = charArray[i];
			if (c > 64 && c < 91) {
				sb.append(PropertyConst.UNDERLINE);
			}
			sb.append(c);
		}
		return sb.toString().toUpperCase();
	}
	
	
	/*************************************************************************
	 * @content: 根据身份证号计算出生日期,如1988-09-07
	 * @param  : idcn 身份证号
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-16
	 * @modDate: 2010-03-16
	 */
	public static String getBirthdayStrFromIDCN(String idcn) {
		if (isBlank(idcn)) {
			throw new NullPointerException("Parameter 'str' is null");
		}
		StringBuilder sb = new StringBuilder();
		if (idcn.length() == 18) {
			sb.append(idcn.substring(6,10))
				.append(PropertyConst.HYPHEN)
				.append(idcn.substring(10,12))
				.append(PropertyConst.HYPHEN)
				.append(idcn.substring(12,14));
		} else if (idcn.length() == 15) {
			sb.append("19").append(idcn.substring(6,8))
				.append(PropertyConst.HYPHEN)
				.append(idcn.substring(8,10))
				.append(PropertyConst.HYPHEN)
				.append(idcn.substring(10,12));
		} else {
			throw new IllegalArgumentException("身份证长度必须为15或18位.");
		}
		return sb.toString();
	}
	
	
	/*************************************************************************
	 * @content: 生成类的hashcode方法代码
	 * @param  : c 待计算类
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-06-09
	 * @modDate: 2010-06-09
	 */
	public static String getClassHashCodeCode(Class c) {
		return "";
	}
	
	
	/*************************************************************************
	 * @content: 生成类的Equals方法代码
	 * @param  : c 待计算类
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-06-09
	 * @modDate: 2010-06-09
	 */
	public static String getClassEqualsCode(Class c) {
		return "";
	}
	
	
	/*************************************************************************
	 * @content: 生成类的toString方法代码
	 * @param  : c 待生成类
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-06-09
	 * @modDate: 2010-06-09
	 */
	public static String getClassToStringCode(Class c) {
		return "";
	}
	
	
	/*************************************************************************
	 * @content: 将对象转换为String，如果对象为null,则返回 ""
	 * @param  : o 待转换对象
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2009-03-15
	 * @modDate: 2010-03-15
	 */
	public static String toString(Object o) {
		return (o == null || PropertyConst.NULL_STR.equals(o)) == true ?
				PropertyConst.EMPTY : o.toString().trim();
	}

	
	/*************************************************************************
	 * @content: 为URL路径添加参数, aa.jsp --> aa.jsp?aa=bb&bb=cc
	 * @param  : href 原始路径
	 * @param  : params 待拼装的字符串参数
	 * @return : String
	 * @author : 那建林
	 * @crtDate: 2011-02-22 10:37:55
	 * @modDate: 2011-02-22 10:37:55
	 */
	public static String addHrefParam(String href, String params) {
		if (isBlank(href)) return ""; 
		if (href.indexOf("?") > -1) {
			href += "&" + params;
		} else {
			href += "?" + (params.indexOf('&') == 0 ? params.substring(1) : params);
		}
		return href;
	}
	
	
	/*************************************************************************
	 * @content: linux 计算md5值
	 * @param  :  
	 * @return : String
	 * @author : najianlin
	 * @crtDate: 2013-8-19 上午10:26:54
	 * @history: 
	 *    1.***，added by najl@chinaskycloud.com at 2013-8-19 上午10:26:54
	 */
	public static String md5sum(String path) throws Exception {
		String rtn = "";
		Process process;
		process = Runtime.getRuntime().exec("md5sum " + path);
		InputStreamReader inputReader = new InputStreamReader(
    			process.getInputStream());
        LineNumberReader lineReader = new LineNumberReader(inputReader);
        String line;
        int index = -1;
        while ((line = lineReader.readLine()) != null){
        	rtn = line.split("  ")[0];
        }
        lineReader.close();
        inputReader.close();
        //System.out.println(rtn + "==" + path);
        return rtn;
	}
	
	/*************************************************************************
	 * @content: 测试对象
	 * @param  : o 待转换对象
	 * @return : String
	 * @author : 那建林
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 * @crtDate: 2009-03-15
	 * @modDate: 2010-03-15
	 */
	public static void printObj(Object obj) {
		try {
			if (obj == null) {
				System.out.println("====================那建林测试的对象null");
				return;
			}
			Class c = obj.getClass();
			System.out.println("那建林测试的对象值为--> " + c.getSimpleName() + " [");
			Field[] fieldArr = c.getDeclaredFields();
			for(Field f :  fieldArr){
				f.setAccessible(true);
				System.out.println("   " + f.getName() + " :  " + f.get(obj));
				
			}
		} catch (Exception e) {
		}
		System.out.println("] <---------------------测试结束");
	}
	public static void printInfo(Class c, Object... objs) {
		for (int i = 0; i < objs.length; i ++) {
			System.out.println("najianlin test: " + c.getSimpleName() + ": "
					+  objs[i] + "=====" +  objs[++i]);
		}
	}
	
	public static void dd(Object o) {
		//System.out.println(o);
	}
}
